# @Time    :2025/4/12 17:17
"""
size()	返回链表中元素个数
is_empty()	判断链表是否为空
insert(index, item)	在指定位置插入元素
append(item)	在末尾插入元素
remove(index)	删除指定位置的元素
set(index, item)	修改指定位置的元素
get(index)	获取指定位置的元素
find(item)	查找链表中某个元素的位置
for_each(func)	遍历链表

"""


class Node:
    """定义一个节点"""

    def __init__(self, data, next=None):
        self.next = next
        self.data = data  # 存储数据


class linkedList:
    """定义一个链表类"""

    def __init__(self):
        self.__head = None
        self.__size = 0

    def __str__(self):
        res = []
        node = self.__head
        while node:
            res.append(str(node.data))  # 字符串拼接要求列表中的每个元素都是字符串类型
            node = node.next
        return "->".join(res)

    def size(self):
        """size()	返回链表中元素个数"""
        return self.__size

    def is_empty(self):
        """is_empty()	判断链表是否为空"""
        return self.__size == 0

    def insert(self, index, item):
        """insert(index, item)	在指定位置插入元素"""
        # 1,需要先判断是否越界
        if index < 0 or index > self.__size:
            raise IndexError("链表越界异常")
        if index == 0:  # index是要插入的位置
            self.__head = Node(item, self.__head)  # 如果要插入的是索引为0的 位置，就是在头节点插入元素。这个
            # 新添加的元素节点，就指向头节点
        else:  # 插入到中间或者尾部
            node = self.__head
            for i in range(index - 1):  # 遍历出要插入的位置前的前的元素数据
                node = node.next  #这个节点就是插入节点的上一个节点。 每次循环就将node 更新为当前节点的下一个节点
            node.next = Node(item, node.next)
        self.__size += 1

    def append(self, item):
        """append(item)	在末尾插入元素"""
        self.insert(self.__size, item)

    def remove(self, index):
        """remove(index)	删除指定位置的元素"""
        if index < 0 or index >= self.__size:
            raise IndexError("链表越界异常")
        if index == 0:
            self.__head = self.__head.next
        else:
            node = self.__head  # 当前节点是头节点
            for i in range(index):  # 找出要删除的节点的前一个节点
                node = node.next
            node.next = node.next.next

        self.__size -= 1

    def set(self, index, item):
        """set(index, item)	修改指定位置的元素"""
        if index < 0 or index >= self.__size:
            raise IndexError("链表越界异常")
        node = self.__head
        for i in range(index):#当前的元素的上一个
            node = node.next
        node.data = item

    def get(self, index):

        """get(index)	获取指定位置的元素"""
        if index < 0 or index >= self.__size:
            raise IndexError("链表越界异常")
        node = self.__head
        for i in range(index):
            node = node.next
        return node.data

    def find(self, item):
        """find(item)	查找链表中某个元素的位置"""
        node = self.__head
        while node:
            if node.data == item:
                return True
            node = node.next
        return False

    def for_each(self, func):
        """for_each(func)	遍历链表"""
        node = self.__head
        while node:
            func(node.data)
            node = node.next

link1=  linkedList()
link1.append(1)
link1.append(2)
link1.append(3)
link1.append(4)
print(link1)
# print(link1.is_empty())
# print(link1.get(1))
# link1.insert(1,1)
# print(link1)
print("--")
link1.for_each(print)
print(link1.get(1))
link1.remove(1)
print(link1)
